Skip to content

오류 해결 및 운동 기록 ui 수정#136

Merged
a06246 merged 2 commits intomainfrom
k
Dec 15, 2025
Merged

오류 해결 및 운동 기록 ui 수정#136
a06246 merged 2 commits intomainfrom
k

Conversation

@a06246
Copy link
Member

@a06246 a06246 commented Dec 15, 2025

No description provided.

@a06246 a06246 merged commit 07beae0 into main Dec 15, 2025
1 check passed
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review by ChatGPT

backgroundColor: "transparent",
},
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰

1. 삭제된 onOrderChange props

  • onOrderChange prop이 삭제되었는데, 이 기능을 사용하는 다른 부분 (예: 부모 컴포넌트)에서 문제가 발생할 수 있습니다. 이 prop을 사용하는 코드가 없다면 삭제해도 괜찮지만, 관련된 부분이 있다면 이 과정을 문서화하고 동작이 어떻게 바뀔 것인지 명시해야 합니다.

2. 데이터 변환

  • parseInt를 사용하여 문자열을 정수로 변환하는 부분이 보입니다. 이 경우 사용자가 유효하지 않은 값을 입력할 경우 0으로 기본값을 설정하고 있습니다. 이는 의도하지 않은 동작을 유발할 수 있습니다. 예를 들어, 비어 있거나 문자를 입력한 경우 명시적으로 에러 처리를 해주는 것이 좋습니다.
  • 예를 들어, onWeightChangeonRepsChange에서 유효성 검사 로직을 추가하여 사용자가 잘못된 값을 입력하지 않도록 해야 합니다.

3. 스타일 및 접근성

  • 스타일링에서 특정 값(색상 등)을 하드코딩하고 있습니다. 이 값은 상수로 정의하거나 테마를 사용하여 처리하면 유지보수가 쉬워질 것입니다.
  • 접근성을 고려하여 접근 가능한 텍스트 및 아이콘에 대한 설명을 추가하는 것이 좋습니다. 예를 들어, TouchableOpacityaccessibleaccessibilityLabel 속성을 추가하면 좋습니다.

4. 반응형 디자인 성능

  • TextInput 및 기타 UI 요소에 대한 최대 너비를 %로 설정하는 것은 좋지만, 너무 많은 너비를 사용할 경우 작은 화면에서 잘리지 않을 수 있습니다. 다양한 해상도에서의 테스트가 필요합니다.

5. 주석

  • 주석을 통해 코드의 함수나 동작에 대한 설명을 제공하는 것은 좋습니다. 그러나 주석은 더 구체적이어야 합니다. 예를 들어, // 완료 버튼의 경우 완료 버튼의 동작이나 사용 사례를 더 명확히 설명해야 합니다.

이와 같은 점을 개선하면 코드를 더 안전하고 유지보수하기 쉬운 상태로 만드는 데 도움이 될 것입니다.

letterSpacing: 0.5,
},
commentSendButton: {
backgroundColor: "#e3ff7c",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드에서 몇 가지 주목해야 할 사항이 있습니다:

  1. 스크롤 뷰 참조: detailScrollViewRef를 사용하여 스크롤을 조절하는데, 이 ref가 유효한지 확인해야 합니다. 스크롤 뷰가 렌더링되기 전에 참조가 null일 수 있으므로 이 부분에서 오류가 발생할 수 있습니다.

  2. 코드 중복: UI 요소의 많은 부분에서 색상 변경(예: 텍스트, 아이콘 등)이 발생했습니다. 이를 스타일 시트에서 클래스로 분리하면 중복을 줄이고 관리하기 쉬울 것입니다.

  3. 버튼 활성화/비활성화: 버튼 상태를 조건부 로직으로 검사하고 있으니, 이와 관련된 상태(state) 관리가 적절하게 이루어지는지 확인해야 합니다. 예를 들어 canFinishWorkout과 같은 상태 변수가 업데이트되는지 유의해야 합니다.

  4. 코드 가독성: 주석이 많이 추가되어 있으나, 어떤 부분에 대해 더 구체적인 설명이 필요한지 명확하지 않는 경우가 있습니다. 함수 및 주요 흐름에 대한 주석을 추가하여 가독성을 높이면 좋겠습니다.

  5. 전체적인 UI 스타일링: UI에서 같은 요소에 대해 많은 배경 색상이나 경계 스타일이 반복적으로 사용되고 있습니다. 이러한 부분을 잘 관리하면 일관성을 높일 수 있습니다.

이러한 문제들 때문에 코드의 퀄리티가 저하될 수 있으니, 배포 전에 검토가 필요합니다.


// 식단 데이터
const meals = [
{

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 코멘트

  1. 비동기 처리의 안정성: Promise.all을 사용하여 영양 성분과 운동 시간 데이터를 병렬로 가져오는 것은 좋은 접근법입니다. 그러나, 요청이 실패할 경우에는 각 실패로 인한 예외 처리가 필요합니다. 특히, nutritionResults 또는 workoutTimeResults에서 데이터 변형 시, undefined가 발생할 수 있습니다. 이는 최종 데이터를 설정할 때 예기치 않은 오류를 일으킬 수 있습니다.

  2. 오류 로그 처리: 오류 로그를 console.error로 기록하고 있으나, 사용자에게 에러에 대한 적절한 피드백이 없습니다. 사용자에게 신뢰성 있는 피드백을 주는 것이 중요합니다. 예를 들어, 오류 발생 시 UI에서 사용자에게 알림을 표시할 수 있습니다.

  3. 네트워크 요청의 반복성: useEffect에서 loadWeeklyProgressloadMonthlyProgress를 반복적으로 호출하고 있습니다. 데이터가 불필요하게 중복 요청되거나 성능에 영향을 줄 수 있는지 고려해야 합니다. 예를 들어, monthBase가 변경될 때만 데이터를 제공하는 것이 좋습니다.

  4. 타입 안정성: DailyProgressWeekItem의 정확한 타입을 보장하기 위해 필요한 데이터가 모두 존재하는지 검증하는 로직이 필요합니다. 각 항목의 기본값을 설정할 때, 더 명확한 타입 검사를 추가하는 것이 좋습니다.

  5. 서버 호출을 연기하는 방법: 두 개의 비동기 요청에 대한 setTimeout을 사용하고 있습니다. 이는 직접적인 의도에 반할 수 있으며, 서버가 가능하다면 응답 후 필요한 데이터를 가져오는 가장 안전한 방법을 모색해야 합니다.

  6. 비즈니스 로직의 재사용: 주기적으로 같은 데이터에 대해 요청을 해야 하는 경우, 이를 별도의 함수로 분리하여 코드 중복을 피하고 유지보수를 용이하게 할 수 있습니다.

  7. 변수 네이밍: updatedData의 사용과 관련해 더 의미있는 변수명을 사용하는 것이 좋습니다. 예를 들면, mergedWeeklyData와 같이 이름을 지정함으로써 코드 가독성을 높일 수 있습니다.


setLoading(false);

// 200 응답 (온보딩 완료) → Alert 없이 바로 홈으로 이동

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 코멘트

  1. 목표 칼로리 설정 로직: 기본 칼로리 목표를 설정하는 부분에서 mealAPI.setNutritionGoal 호출이 실패할 경우, 해당 오류를 콘솔에 기록만 하고 무시하는 방식입니다. 이는 이후의 로직이나 사용자 경험에 영향을 줄 수 있습니다.

    • 사용자가 칼로리 목표 설정 실패를 특정할 수 없으므로, 오류 아래에서 사용자에게 적절한 피드백을 제공하는 것이 좋습니다.
  2. Hardcoding: 기본 칼로리 목표가 하드코딩되어 있습니다. 이 값이 변경될 수 있는 부분이라면, 상수화하거나 외부 설정에서 정의하는 방식을 고려해 볼 수 있습니다. 이는 향후 유지보수와 유연성을 높이는 데 도움을 줄 수 있습니다.

  3. 에러 핸들링: goalError를 로그에 출력하고 있지만, 오류가 발생할 경우 사용자에게 구체적인 피드백을 제공하지 않으면 사용자 경험이 저하될 수 있습니다. 예를 들어, 목표 설정이 실패했음을 사용자에게 알리도록 메시지를 추가하는 것이 좋습니다.

  4. 확장성: 현재 목표 설정에서 탄수화물, 단백질, 지방의 값을 0으로 두고 있습니다. 이는 나중에 추후 확장할 수 있는 유연성이 떨어질 수 있습니다. 구성 가능한 구조로 변경하는 것도 고려해야 합니다.

  5. 날짜 포맷: 오늘 날짜를 문자열로 변환하는 부분에서 특정 형식을 따르고 있습니다. 이 부분이 시스템의 요구 사항에 적합한지 다시 확인할 필요가 있습니다. 예를 들어, 시간대 문제로 인해 올바르지 않은 날짜가 설정될 수 있습니다.

종합적으로, 코드 로직을 개선하고 명확한 사용자 피드백을 제공하는 방향으로 수정할 필요가 있습니다.


setShowCompleteScreen(true);
} else {
const errorMessage = response.message || '회원가입에 실패했습니다';

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰

  1. 의존성 주입: mealAPIauthAPI와 함께 services에서 가져오는 것은 적절하지만, 이와 관련된 모든 API 호출이 안전하게 실행되도록 확인해야 합니다.

  2. 기본 칼로리 목표 설정: setNutritionGoal에 전달하는 값에서 0으로 설정된 targetCarbs, targetProtein, targetFat에 대한 고려가 필요합니다. 실제로 0으로 설정하는 것이 비즈니스 로직에 맞는지 재검토해야 합니다.

  3. 예외 처리: 칼로리 목표 설정 실패 시 회원가입이 성공으로 처리되도록 주석이 명시되어 있지만, 사용자 경험 측면에서 문제가 될 수 있습니다. 적절한 오류 메시지를 사용자에게 전달하도록 하는 것이 좋습니다.

  4. 로깅: console.error로 오류를 로그하는 것은 좋은 습관이나, 프로덕션 환경에서는 로깅 라이브러리를 사용하는 것이 바람직합니다. 이렇게 하면 로그를 더 잘 관리하고 분석할 수 있습니다.

  5. 날짜 포맷: 날짜를 YYYY-MM-DD 포맷으로 변환하는 부분에서는 toISOString과 같은 메서드를 활용하는 것이 나을 수 있습니다. 이 방법은 날짜 포맷에 대한 일관성을 보장할 수 있습니다.

  6. 비교적인 API 호출: signup 후에 칼로리 목표를 설정하는 프로세스는 비동기적이므로, 사용자에게 적절한 피드백을 제공하기 위한 별도의 로딩 상태를 관리하는 것이 좋습니다.

이러한 사항들을 개선한다면 코드 품질과 안정성이 향상될 것입니다.

fontSize: 20,
},
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 패치에서 몇 가지 문제가 발견되었습니다.

  1. LinearGradient 제거: 코드에서 LinearGradient가 제거되었습니다. 이는 UI에 부정적인 영향을 미칠 수 있습니다. 버튼이나 메시지에 그라데이션이 필요하다면 다시 추가하는 것이 좋습니다.

  2. onPress 이벤트: TouchableOpacity에서 activeOpacity 속성이 삭제되었습니다. 이를 재사용하거나 명시적으로 작성하여 사용자 경험을 향상시켜야 합니다.

  3. 스타일 제거: 여러 스타일이 완전히 삭제되었습니다. 만약 이런 스타일들이 잘 작동하고 있었다면 예기치 않은 UI 변경이 발생할 수 있습니다. 특히 메시지 스타일링에 대한 변경은 사용자 인터페이스에 큰 영향을 미칠 수 있습니다.

  4. 일관성: 'Loading' 메시지 구현에서 다른 스타일을 사용했습니다. 이는 사용자에게 혼동을 줄 수 있기 때문에 UI 요소들 간의 일관성을 유지하는 것이 중요합니다.

  5. 이벤트 처리가 없어졌습니다: 입력 필드에서의 업데이트 및 제출 이벤트(특히 onChangeTextonSubmitEditing)가 제거되었습니다. 이것은 주요 기능에서 버그를 유발할 수 있습니다.

개선 제안:

  • UI 테스트를 통해 디자인 변경 사항을 재검토할 것을 권장합니다.
  • 코드 변경 사항이 실제로 필요한지 확인하고, 마이그레이션 소스에 대한 충분한 검토와 테스트를 진행하세요.

eventBus.emit('mealDeleted', { date: dateStr, mealId });
} catch (error: any) {
console.error('식사 삭제 실패:', error);
let errorMessage = '식사 삭제에 실패했습니다.';

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰

  1. 이벤트 버스 사용: eventBus.emit을 사용하여 식사 삭제 이벤트를 발생시키고 있습니다. 이 부분에서 이벤트가 제대로 처리되지 않거나, 구독자(리스너)가 없을 경우 아무런 반응이 없을 수 있습니다. 이에 대한 에러 핸들링이나 경고가 필요할 수 있습니다.

  2. 날짜 포맷: formatDateToString(dateToFetch)와 같은 함수 호출로 날짜를 포맷하고 있습니다. 이 함수가 잘못된 형식을 반환할 경우, 이벤트가 의도한 대로 작동하지 않을 수 있습니다. 날짜 포맷이 일관되게 유지되는지 확인해야 합니다.

  3. 목적에 따른 로직 분리: 월간 및 주간 달력에 대한 데이터 새로 고침 로직이 if 블록 내에 잘 정리되어 있지만, 이 로직들을 별도의 함수로 분리하는 것이 코드 가독성을 높이고 유지보수를 쉽게 할 수 있습니다.

  4. 변수명: showMonthView, dateToFetch, monthBase 등 변수명이 의도를 잘 나타내고 있지만, 코드의 특정 맥락에서 외부 이해하기가 어려울 수 있습니다. 변수명에 더 많은 정보를 포함시키면 좋을 것 같습니다 (예: isMonthViewShown, fetchDate, baseMonthDate 등).

  5. 에러 핸들링 강화: catch 블록에서 에러 메시지를 로그로 출력하고 있지만, 사용자에게 더 구체적인 오류 메시지를 보여줄 수 있도록 개선할 필요가 있습니다. 예를 들어, 네트워크 오류와 같은 특정 에러에 대해 다르게 처리할 수 있습니다.

  6. 조기 반환 패턴: 성공적인 API 호출 후 데이터 갱신 및 이벤트를 발생시키기 전에, 예외 상황이 발생하면 조기에 반환하는 방식으로 코드를 개선해보세요. 이렇게 하면 코드가 더 명확해질 수 있습니다.

이러한 점들을 고려하여 코드를 개선하신다면, 안정성과 가독성이 모두 향상될 것입니다.

});
} catch (e) {
console.error("[WORKOUT][DELETE] 삭제 실패:", e);
Alert.alert("오류", "운동 삭제 중 오류가 발생했습니다.");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드에 몇 가지 우려되는 점이 있습니다:

  1. null 체크: deletedActivityworkoutDate 변수를 할당하기 위해 find 메서드를 사용하고 있습니다. deletedActivity가 없을 경우 deletedActivity?.title로 안전하게 접근하고 있으나, workoutDate는 null로 설정되므로 workoutDate가 null일 경우 이벤트에 문제가 발생할 수 있습니다. 이를 예방하기 위해 workoutDate에 대한 체크를 추가해야 할 것 같습니다.

  2. 비동기 처리: 운동 삭제 함수가 비동기적으로 처리된 후 setAllActivities가 호출됩니다. 만약 삭제 작업이 실패하면 기존 상태가 웬만한 정합성을 잃을 수 있어서, 비동기 처리에 대한 예외 처리를 개선할 필요가 있습니다.

  3. 대기 시간 관리: eventBus.emit 호출 시 응답이 비동기적으로 발생할 경우, 두 개의 이벤트가 동시에 발생할 위험이 있습니다. 이러한 이벤트 간의 동기화가 누락되면 이벤트가 제대로 처리되지 않을 수 있습니다. 각 이벤트 발행 후 적절한 대기 시간을 두거나, 다른 방법으로 진행 상태를 관리하는 것이 좋습니다.

  4. 코드 중복: workoutDate를 생성하는 과정이 workoutSessionSavedworkoutSessionDeleted 코드에서 중복적으로 나타납니다. 이 부분을 함수로 분리하여 코드의 재사용성을 높이고 유지 보수를 용이하게 할 수 있습니다.

이러한 우려 사항을 고려하여 추가적인 검토 및 개선이 필요합니다.


// 위젯 편집 화면에서 돌아올 때 위젯 순서 다시 불러오기
useEffect(() => {
const unsubscribe = navigation.addListener("focus", () => {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰

  1. 식사 시간대 변경: 아침의 시간대가 변경되었습니다. 00:0004:00에서 00:0010:00으로 변경되었는데, 이로 인해 아침 식사가 언제나 이루어질 가능성이 높아졌습니다. 실제 사용자의 기대와 반할 가능성이 있으므로 이 변경이 올바른지 확실히 해야 합니다.

  2. 현재 시간 계산: 한국 시간대 계산을 위해 getTimezoneOffset()을 사용하는 것은 올바른 접근이지만, 이를 통해 상대적으로 정확한 시간을 보장하고 있지는 않습니다. 특히, DST(일광 절약 시간제)가 적용될 경우 문제가 발생할 수 있습니다. 따라서 toLocaleString 방법과 같이 컨텐츠의 지역화된 출력으로 시간을 직접 가져오는 방법이 더 신뢰성을 가질 수 있습니다.

  3. 예외 처리: 예외 처리가 현재는 발생하지 않지만 안전을 위해 설정되어 있는 부분이 있습니다. 이 코드의 목적이 명확히 드러나지 않으므로, 주석을 추가하여 미래의 사용자가 이해할 수 있도록 하는 것이 좋습니다.

  4. useEffect 의존성 배열: 식사 삭제 이벤트와 관련된 useEffect에서 의존성 배열이 비어 있습니다. 이 경우, 컴포넌트가 처음 마운트될 때만 리스너가 설정되므로 다른 상태나 속성의 변화에 따라 업데이트되어야 하는 부분이 있을 수 있습니다. 특히 loadMealRecommendationloadWeeklyProgress 호출이 이 컴포넌트의 상태에 의존한다면, 해당 값을 의존성 배열에 포함시키는 것이 좋습니다.

  5. console.log 사용: 디버깅을 위한 console.log 문장이 포함되어 있습니다. 이는 개발 단계에서는 유용하지만, 운영 환경에 배포할 때는 제거하는 것이 좋습니다. 이러한 로그는 성능에 영향을 줄 수 있으며, 대량의 로그는 사용자에게 불편을 초래할 수 있습니다.

개선 제안

  • koreaTime 계산 방식을 유지하되, DST를 고려한 다른 라이브러리(예: moment-timezone)를 활용하거나, Intl.DateTimeFormat을 사용하는 것을 추천합니다.
  • mealTypeNametargetMealType 변수를 설정할 때, 코드의 가독성을 높이기 위해 switch 문을 사용하는 것이 더 명확할 수 있습니다.

};
};

type EventKey = keyof EventMap;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치는 몇 가지 고려 사항이 있습니다.

  1. 타입 안정성: sessionIdstring | number | null로 정의되어 있지만, 서로 다른 타입의 값들을 사용하는 것에 대해 적절한 타입 검증이 필요한지 고민해보아야 합니다. 이를 통해 런타임 오류의 위험을 줄일 수 있습니다.

  2. 필드의 필수성 검토: workoutSessionSavedmealDeleted의 각 필드는 선택적이지만, 비즈니스 로직에 따라 특정 필드가 필수일 수도 있습니다. 필요한 필드를 필수로 만들 수 있는지 확인하고, 코드 유지 관리를 쉽게 하기 위해 이를 반영하는 것이 좋습니다.

  3. 주석 추가: 각 타입 정의에 대한 간단한 주석을 추가하여 향후 코드 이해도와 유지보수성을 높이는 것이 좋습니다.

  4. 객체의 일관성: 타입 EventMap의 구조에 일관성이 있도록 추가할 속성이 무엇인지 명확히 정의하는 것이 중요합니다. 명확한 API 스펙이 없으면 구현에 혼란을 초래할 수 있습니다.

따라서, 충분한 검토와 리팩토링 후에 머지하는 것이 좋습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant